package cn.lyf.myblog.controller.api;

import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.node.*;

public class JsonUtils {

    public final static ObjectMapper mapper = new ObjectMapper();
    static {
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

    public static String getString(JsonNode json, String path) {
        json = json.at(path);
        if (json.toString().equals("") || json.toString().equals("null"))
            return null;
        return json.asText();
    }

    public static String getString(JsonNode json, String path, String defaultValue) {
        return json.at(path).asText(defaultValue);
    }

    public static Boolean getBoolean(JsonNode json, String path) {
        json = json.at(path);
        if (json.toString().equals("") || json.toString().equals("null"))
            return null;
        return json.asBoolean();
    }

    public static Boolean getBoolean(JsonNode json, String path, boolean defaultValue) {
        return json.at(path).asBoolean(defaultValue);
    }

    public static Integer getInteger(JsonNode json, String path) {
        json = json.at(path);
        if (json.toString().equals("") || json.toString().equals("null"))
            return null;
        return json.asInt();
    }

    public static Integer getInteger(JsonNode json, String path, int defaultValue) {
        return json.at(path).asInt(defaultValue);
    }

    public static JsonNode getJsonNode(JsonNode json, String path) {
        return json.at(path);
    }

    public static ObjectNode success(String message, Object result) {
        ObjectNode res = mapper.createObjectNode();
        res.put("success", true);
        res.put("code", 200);
        res.put("message", message);
        if (result instanceof JsonNode) {
            res.set("result", (JsonNode) result);
        } else {
            res.putPOJO("result", res);
        }
        return res;
    }

    public static ObjectNode fail(String message, int code) {
        ObjectNode res = mapper.createObjectNode();
        res.put("success", true);
        res.put("code", code);
        res.put("message", message);
        return res;
    }
}
